package com.customization.unionpay.market.util;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.engine.cube.biz.ShardingActionHelper;
import weaver.conn.RecordSet;
import weaver.conn.RecordSetTrans;
import weaver.formmode.setup.ModeRightInfo;
import weaver.general.Util;
import weaver.hrm.User;
import weaver.integration.logging.Logger;
import weaver.integration.logging.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * @author sjm
 * @description 未核销预付款结转明细台账相关
 */
public class CarryoverOfUnverifiedDetails {

    private static final Logger log = LoggerFactory.getLogger(CarryoverOfUnverifiedDetails.class);


    /**
     * 根据营销事项申请单号和授权码查询未核销预付款结转明细台账数据
     *
     * @param maintablename
     * @param code
     * @return
     */
    public static List<JSONObject> selectCarryoverOfUnverifiedDetailsBySth(String maintablename, String code, String authCode) {
        RecordSet rst = new RecordSet();
        // 根据当前信息使用id修改新建数据
        String sql = "select id from #{tableName} where  yxsxsqdh=? and yxpthdsqm=? ";
        sql = sql.replace("#{tableName}",maintablename);
        log.info("sql:"+sql);
        rst.executeQuery(sql,code,authCode);

        List<JSONObject> list = new ArrayList<>();
        while (rst.next()) {
            JSONObject json = new JSONObject();
            json.put("id", Util.null2String(rst.getString("id")));
            list.add(json);
        }
        return list;
    }

    /**
     * 根据期间查询未核销预付款结转明细台账数据
     *
     * @param maintablename
     * @param qj
     * @return
     */
    public static List<JSONObject> selectCarryoverOfUnverifiedDetailsByQJ(String maintablename, String qj) {
        RecordSet rst = new RecordSet();
        // 根据当前信息使用id修改新建数据
        String sql = " select id,yxsxsqdh, yxpthdsqm, cwsfjs, sfwdxy, jjsx, gysbh, htbh, zjly, ACT_TP, " +
                " yrzje, yhxje, dhxje, rzpch from #{tableName} where qj=? ";
        sql = sql.replace("#{tableName}",maintablename);
        log.info("sql:"+sql);
        rst.executeQuery(sql,qj);

        List<JSONObject> list = new ArrayList<>();
        while (rst.next()) {
            JSONObject json = new JSONObject();
            json.put("id", Util.null2String(rst.getString("id")));
            json.put("yxsxsqdh", Util.null2String(rst.getString("yxsxsqdh")));
            json.put("yxpthdsqm", Util.null2String(rst.getString("yxpthdsqm")));
            json.put("cwsfjs", Util.null2String(rst.getString("cwsfjs")));
            json.put("sfwdxy", Util.null2String(rst.getString("sfwdxy")));
            json.put("jjsx", Util.null2String(rst.getString("jjsx")));
            json.put("gysbh", Util.null2String(rst.getString("gysbh")));
            json.put("htbh", Util.null2String(rst.getString("htbh")));
            json.put("zjly", Util.null2String(rst.getString("zjly")));
            json.put("ACT_TP", Util.null2String(rst.getString("ACT_TP")));
            json.put("yrzje", Util.null2String(rst.getString("yrzje")));
            json.put("yhxje", Util.null2String(rst.getString("yhxje")));
            json.put("dhxje", Util.null2String(rst.getString("dhxje")));
            json.put("rzpch", Util.null2String(rst.getString("rzpch")));
            list.add(json);
        }
        return list;
    }


    /**
     * 根据批次号查询id
     *
     * @param maintablename
     * @param field
     * @param pch
     * @return
     */
    public static List<String> selectIdByFieldAndPch(String maintablename, String field,String pch) {
        RecordSet rst = new RecordSet();
        // 根据当前信息使用id修改新建数据
        StringBuilder sql = new StringBuilder(" select id from " );
        sql.append(maintablename);
        sql.append(" where ");
        sql.append(field);
        sql.append("='");
        sql.append(pch);
        sql.append("' ");
        log.info("sql:"+sql.toString());
        rst.executeQuery(sql.toString());
        List<String> list = new ArrayList<>();
        while (rst.next()) {
            String qj = Util.null2String(rst.getString("id"));
            if(!"".equals(qj)){
                list.add(qj);
            }
        }
        return list;
    }

    /**
     * 根据唯一值查询没有凭证的未核销预付款结转明细台账数据批次号
     *
     * @param maintablename
     * @param field
     * @param pch
     * @return
     */
    public static List<String> selectCarryoverOfUnverifiedDetailsPch(String maintablename, String field,String pch) {
        RecordSet rst = new RecordSet();
        // 根据当前信息使用id修改新建数据
        String sql = " select "+pch+" from "+maintablename+" where "+pch+" is not null and ("+field+" is null or "+field+"='') group by "+pch+" ";
        log.info("sql:"+sql);
        rst.executeQuery(sql);
        List<String> list = new ArrayList<>();
        while (rst.next()) {
            String qj = Util.null2String(rst.getString(pch));
            if(!"".equals(qj)){
                list.add(qj);
            }
        }
        return list;
    }

    /**
     * 修改不同批次号通过id
     * @param id                            id
     * @param uuid                          批次号
     * @param field                         修改字段
     * @param tableName
     * @return
     */
    public static void updatePchById(String id,String uuid,String field,String tableName) {
        RecordSetTrans rst = new RecordSetTrans();
        // 开启事务（关闭自动提交）
        rst.setAutoCommit(false);
        try {
            StringBuilder updateSql = new StringBuilder("update " );
            updateSql.append(tableName);
            updateSql.append(" set ");
            updateSql.append(field);
            updateSql.append("='");
            updateSql.append(uuid);
            updateSql.append("' where id='");
            updateSql.append(id);
            updateSql.append("' ");
            log.info("updateSql:"+updateSql.toString());
            // 修改日报表申请单号
            rst.executeUpdate(updateSql.toString());
            // 提交事务
            rst.commit();
        } catch (Exception e) {
            log.error("修改批次号异常："+e.getMessage());
            // 回滚
            rst.rollback();
        }
    }

    /**
     * 修改不同凭证号通过id
     * @param id                            id
     * @param uuid                          凭证号
     * @param field                         修改字段
     * @param tableName
     * @return
     */
    public static void updatePzhById(String id,String uuid,String field,String tableName) {
        RecordSetTrans rst = new RecordSetTrans();
        // 开启事务（关闭自动提交）
        rst.setAutoCommit(false);
        try {
            String updateSql = "update #{tableName} set #{field}=? where id=? ";
            updateSql = updateSql.replace("#{tableName}",tableName);
            updateSql = updateSql.replace("#{field}",field);
            log.info("updateSql:"+updateSql);
            // 修改日报表申请单号
            rst.executeUpdate(updateSql,uuid,id);
            // 提交事务
            rst.commit();
        } catch (Exception e) {
            // 回滚
            rst.rollback();
            log.error("修改凭证号异常："+e.getMessage());
        }
    }



    /**
     * 添加未核销预付款结转台账数据
     *
     * @param formId
     * @param formmodeId
     * @param maintablename
     * @param user
     * @param qj 期间
     * @param yxsxsqdh 营销事项申请单号
     * @param yxpthdsqm 营销平台活动授权码
     * @param cwsfjs 财务是否结束
     * @param gs     公司
     * @param bm     部门
     * @param sfwdxy 是否为大协议
     * @param jjsx   经济事项
     * @param gysbh  供应商编号
     * @param htbh   合同编号
     * @param zjly   资金来源
     * @param ACT_TP 活动类型
     * @param yrzje 已入账金额
     * @param yhxje 已核销金额
     * @param dhxje 待核销金额
     * @param rzpch 入账批次号
     * @param jsrq  结算日期
     * @param jzpzh 结转凭证号
     * @param cxrq  冲销日期
     * @param cxpzh 冲销凭证号
     *
     */
    public static void addCarryoverOfUnverifiedDetailsByFormId(int formId, int formmodeId, String maintablename, User user, String qj, String yxsxsqdh, String  yxpthdsqm, String  cwsfjs, String  gs, String  bm,
                                                               String  sfwdxy, String  jjsx, String  gysbh, String  htbh, String  zjly, String  ACT_TP, String  yrzje,
                                                               String  yhxje, String  dhxje, String  rzpch, String  jsrq, String  jzpzh, String  cxrq, String  cxpzh) {
        RecordSetTrans rst = new RecordSetTrans();
        // 开启事务（关闭自动提交）
        rst.setAutoCommit(false);

        // 先调用内部方法新建一条数据，获取数据id
        int billid = FormDataUtils.getBillId(maintablename, formmodeId, user.getUID(), user.getType());

        try {
            // 获取formbizid
            String formBizId = ShardingActionHelper.constructBizId(billid, formId);

            // 根据当前信息使用id修改新建数据
            String updateSql = "update #{tableName} set qj=?, yxsxsqdh=?, yxpthdsqm=?, cwsfjs=?, gs=?, bm=?, sfwdxy=?, jjsx=?, gysbh=?, htbh=?, zjly=?, ACT_TP=?, yrzje=?, yhxje=?, dhxje=?, rzpch=?, jsrq=?, jzpzh=?, cxrq=?, cxpzh=?, form_biz_id = ? where id = ? ";
            updateSql = updateSql.replace("#{tableName}",maintablename);
            log.info("updateSql:"+updateSql);
            rst.executeUpdate(updateSql,qj,yxsxsqdh,yxpthdsqm,cwsfjs,gs,bm,sfwdxy,jjsx,gysbh,htbh,zjly,ACT_TP,yrzje,yhxje,dhxje,rzpch,jsrq,jzpzh,cxrq,cxpzh,formBizId,billid);
            // 提交事务
            rst.commit();

            // 权限重构
            ModeRightInfo modeRightInfo = new ModeRightInfo();
            modeRightInfo.setNewRight(true);
            modeRightInfo.editModeDataShare(user.getUID(), formmodeId, billid);

        } catch (Exception e) {
            // 回滚
            rst.rollback();
            ClearFundButtonRelated.deleteByBillId(maintablename, billid);
            log.error("添加数据异常：" + e.getMessage());
        }
    }

    /**
     * 根据id修改未核销预付款结转台账
     *
     * @param maintablename
     * @param id
     * @param qj 期间
     * @param yxsxsqdh 营销事项申请单号
     * @param yxpthdsqm 营销平台活动授权码
     * @param cwsfjs 财务是否结束
     * @param gs     公司
     * @param bm     部门
     * @param sfwdxy 是否为大协议
     * @param jjsx   经济事项
     * @param gysbh  供应商编号
     * @param htbh   合同编号
     * @param zjly   资金来源
     * @param ACT_TP 活动类型
     * @param yrzje 已入账金额
     * @param yhxje 已核销金额
     * @param dhxje 待核销金额
     * @param rzpch 入账批次号
     * @param jsrq  结算日期
     * @param jzpzh 结转凭证号
     * @param cxrq  冲销日期
     * @param cxpzh 冲销凭证号
     */
    public static void updateCarryoverOfUnverifiedDetailsById(String maintablename, String id,  String qj,  String yxsxsqdh, String  yxpthdsqm, String  cwsfjs, String  gs, String  bm,
                                                              String  sfwdxy, String  jjsx, String  gysbh, String  htbh, String  zjly, String  ACT_TP, String  yrzje,
                                                              String  yhxje, String  dhxje, String  rzpch, String  jsrq, String  jzpzh, String  cxrq, String  cxpzh) {
        RecordSetTrans rst = new RecordSetTrans();
        // 开启事务（关闭自动提交）
        rst.setAutoCommit(false);
        try {
            // 根据当前信息使用id修改新建数据
            StringBuilder updateSql = new StringBuilder();
            updateSql.append("update ");
            updateSql.append(maintablename);
            updateSql.append(" set ");
            if(StrUtil.isNotBlank(qj)){
                updateSql.append(" qj='");
                updateSql.append(qj);
            }
            if(StrUtil.isNotBlank(yxsxsqdh)){
                updateSql.append("', ");
                updateSql.append(" yxsxsqdh='");
                updateSql.append(yxsxsqdh);
            }
            if(StrUtil.isNotBlank(yxpthdsqm)){
                updateSql.append("', ");
                updateSql.append(" yxpthdsqm='");
                updateSql.append(yxpthdsqm);
            }
            if(StrUtil.isNotBlank(cwsfjs)){
                updateSql.append("', ");
                updateSql.append(" cwsfjs='");
                updateSql.append(cwsfjs);
            }
            if(StrUtil.isNotBlank(gs)){
                updateSql.append("', ");
                updateSql.append(" gs='");
                updateSql.append(gs);
            }
            if(StrUtil.isNotBlank(bm)){
                updateSql.append("', ");
                updateSql.append(" bm='");
                updateSql.append(bm);
            }
            if(StrUtil.isNotBlank(sfwdxy)){
                updateSql.append("', ");
                updateSql.append(" sfwdxy='");
                updateSql.append(sfwdxy);
            }
            if(StrUtil.isNotBlank(jjsx)){
                updateSql.append("', ");
                updateSql.append(" jjsx='");
                updateSql.append(jjsx);
            }
            if(StrUtil.isNotBlank(gysbh)){
                updateSql.append("', ");
                updateSql.append(" gysbh='");
                updateSql.append(gysbh);
            }
            if(StrUtil.isNotBlank(htbh)){
                updateSql.append("', ");
                updateSql.append(" htbh='");
                updateSql.append(htbh);
            }
            if(StrUtil.isNotBlank(zjly)){
                updateSql.append("', ");
                updateSql.append(" zjly='");
                updateSql.append(zjly);
            }
            if(StrUtil.isNotBlank(ACT_TP)){
                updateSql.append("', ");
                updateSql.append(" ACT_TP='");
                updateSql.append(ACT_TP);
            }
            if(StrUtil.isNotBlank(yrzje)){
                updateSql.append("', ");
                updateSql.append(" yrzje='");
                updateSql.append(yrzje);
            }
            if(StrUtil.isNotBlank(yhxje)){
                updateSql.append("', ");
                updateSql.append(" yhxje='");
                updateSql.append(yhxje);
            }
            if(StrUtil.isNotBlank(dhxje)){
                updateSql.append("', ");
                updateSql.append(" dhxje='");
                updateSql.append(dhxje);
            }
            if(StrUtil.isNotBlank(rzpch)){
                updateSql.append("', ");
                updateSql.append(" rzpch='");
                updateSql.append(rzpch);
            }
            if(StrUtil.isNotBlank(jsrq)){
                updateSql.append("', ");
                updateSql.append(" jsrq='");
                updateSql.append(jsrq);
            }
            if(StrUtil.isNotBlank(jzpzh)){
                updateSql.append("', ");
                updateSql.append(" jzpzh='");
                updateSql.append(jzpzh);
            }
            if(StrUtil.isNotBlank(cxrq)){
                updateSql.append("', ");
                updateSql.append(" cxrq='");
                updateSql.append(cxrq);
            }
            if(StrUtil.isNotBlank(cxpzh)){
                updateSql.append("', ");
                updateSql.append(" cxpzh='");
                updateSql.append(cxpzh);
            }
            updateSql.append("' ");
            updateSql.append(" where id = '");
            updateSql.append(id);
            updateSql.append("' ");

            log.info("updateSql: "+updateSql.toString());
            rst.executeUpdate(updateSql.toString());
            // 提交事务
            rst.commit();

        } catch (Exception e) {
            // 回滚
            rst.rollback();
            log.error("修改数据异常：" + e.getMessage());
        }
    }
}
